IOC 描述

IOC —— Inversion of control,即控制反转。还有个别名叫 DI(Dependency inject 依赖注入)。

  • 定义

所谓 IoC ,就是由 IoC 容器来负责对象的生命周期和对象之间的关系。

  • 最初的时候

在最早我们使用对象的时候,都是在用到的时候 new 一个,这个会存在一个问题:不灵活。

即当某个类里依赖着某个 new 出来的对象的时候,在后续的使用中,如果需要换个依赖的对象了,需要去修改类里的代码。

IOC 的用处

用 IOC 的用处就是可以避免在类里依赖着某个指定对象时直接使用 new 这样的强耦合情况。

IOC 容器存放着对象,管理着依赖关系。当某个类需要什么对象时,只要声明好它对应的依赖,IOC 容器就会自动找到其所依赖的对象进行注入。

所以这就是控制反转:有传统的直接 new 的方式来主动控制到变成由 IOC 容器来控制进行对象的注入

Spring 里的 IOC 实现

Spring 的 IOC 容器

Spring IOC 容器是一个管理 Bean 的容器,Spring 里所有的 IOC 容器都需要实现 BeanFactory 接口,它是一个顶级容器接口。其源码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package org.springframework.beans.factory;

import org.springframework.beans.BeansExcept 工 on ;
import org.springframework . core.ResolvableType ; public interface BeanFactory {

//前缀
String FACTORY BEAN PREFIX = "&”; //多个 getBean 方法

Object getBean(String name) throws BeansException;

<T> T getBean(String 口ame, Class<T> requiredType) throws Bea口sExcept工on;

<T> T getBean(Class<T> requiredType) throws BeansException;

Object getBean(String name, Object . . args) throws BeansException ;

<T> T getBea口( Class<T> requiredType , Object ... args) throws BeansExcept工on;

//是否包含 Bean
boolean containsBean (String name); II Bean是否单例

boolean isS工ngleton(String name) throws NoSuchBeanDefinitionExcept工on ; II Bean是否原型

boolean isPrototype(String name) throws NoSuchBeanDefinitionException;

//是否类型匹配
bool ean isTypeMatch(String name , ResolvableType typeToMatch) throws NoSuchBeanDefin工tionException;

boolean isTypeMatch(String name , Class<?> typeToMatch) throws NoSuchBeanDefin工tionException;

//获取 Bean 的类型
Class<?> getType(String name) throws NoSuchBeanDefinit工onException ;

//获取 Bean 的别名
String[] getAliases(String name);

}

可以看到上面代码中有多个getBean方法,这也是IoC容器最重要的方法之一, 它的意义是从 IoC 容器中获取 Beano 而从多个 getBean 方法中可 以看到有按类型( by type)获取 Bean 的,也有按 名称( by name)获取 Bean 的,这就意味着在 Spring IoC 容器中 ,允许我们按类型或者名称获取 Bean。

由于 BeanFactory 的功能还不够强大,因此 Spring在 BeanFactory 的基础上, 还设计了一个更为高级的接口 ApplicationContext。 它是 BeanFactory 的子接口之一 , 在 Spring 的体 系中 BeanFactory 和 ApplicationContext 是最为重要的接口设计 ,在现实中我们使用的大部分Spring IoC 容器是 ApplicationContext接口的实现类

装配 bean 至容器中

  • 通过扫描装配,即使用 @Component 注解和 @ComponentScan
  • 用 @Bean 注解来实现装配,对某个方法直接使用 @Bean 注解来将其返回的对象注入到容器里